package com.nageoffer.shortlink.project.common.convention.result;


import com.nageoffer.shortlink.project.common.convention.errorcode.BaseErrorCode;
import com.nageoffer.shortlink.project.common.convention.exception.AbstractException;

import java.util.Optional;

/**
 * 全局返回对象构造器
 */
public final class Results {

	/**
	 * 构造成功响应
	 */
	public static Result<Void> success() {
		return new Result<Void>()
				.setCode(Result.SUCCESS_CODE);
	}

	/**
	 * 构造带返回数据的成功响应
	 */
	public static <T> Result<T> success(T data) {
		return new Result<T>()
				.setCode(Result.SUCCESS_CODE)
				.setData(data);
	}

	/**
	 * 构建服务端失败响应
	 */
	public static Result<Void> failure() {
		return new Result<Void>()
				.setCode(BaseErrorCode.SERVICE_ERROR.code())
				.setMessage(BaseErrorCode.SERVICE_ERROR.message());
	}

	/**
	 * 通过 {@link AbstractException} 构建失败响应
	 */
	public static Result<Void> failure(AbstractException abstractException) {
		String errorCode = Optional.ofNullable(abstractException.getErrorCode())
				.orElse(BaseErrorCode.SERVICE_ERROR.code());
		String errorMessage = Optional.ofNullable(abstractException.getErrorMessage())
				.orElse(BaseErrorCode.SERVICE_ERROR.message());
		return new Result<Void>()
				.setCode(errorCode)
				.setMessage(errorMessage);
	}

	/**
	 * 通过 errorCode、errorMessage 构建失败响应
	 */
	public static Result<Void> failure(String errorCode, String errorMessage) {
		return new Result<Void>()
				.setCode(errorCode)
				.setMessage(errorMessage);
	}
}
